package main

import (
	"fmt"
	"os"
	"path"
	"path/filepath"
	"reflect"
)

func walkFunc(path string, info os.FileInfo, err error) error {
	if info != nil {
		fmt.Printf("path:%s  name:%s  size:%v  isDir:%v  \n", path, info.Name(), info.Size(), info.IsDir())
	}
	return nil
}

func main() {
	//Base,Dir的代码示例
	fmt.Println("Example:------> Use of Base and Dir function <------")

	//1.Dir 返回路径中除去最后一个路径元素的部分,Base 函数返回路径的最后一个元素
	dir := "/home/polaris/studygolang.go"
	fmt.Printf("Base1:%s Dir1:%s\n", filepath.Base(dir), filepath.Dir(dir)) //Base1:studygolang.go Dir1:\home\polaris

	//2.如果路径是"",Base和Dir的值都是.
	dir = ""
	fmt.Printf("Base2:%s Dir2:%s\n", filepath.Base(dir), filepath.Dir(dir)) //Base2:. Dir2:.

	//3.如果路径由1到多个斜杠后跟0到多个非斜杠字符组成，Dir会返回"/"
	dir = "///sdf"
	fmt.Printf("Base3:%s Dir3:%s\n", filepath.Base(dir), filepath.Dir(dir)) //Base3:sdf Dir3:\

	//
	dir = "components/author_info.tpl"
	fmt.Printf("Base4:%s Dir4:%s\n", filepath.Base(dir), filepath.Dir(dir)) //Base4:author_info.tpl Dir4:components

	//
	dir = "/home/polaris/studygolang/"
	fmt.Printf("Base5:%s Dir5:%s\n", filepath.Base(dir), filepath.Dir(dir)) //Base4:studygolang Dir4:\home\polaris\studygolang
	appname := os.Args[0]
	fmt.Println("appname:", appname)
	fmt.Printf("Base6:%s Dir6:%s\n", filepath.Base(appname), filepath.Dir(appname)) //Base5:filepath.exe Dir5:H:\git\go_api_study\file\filepath
	//Ext代码示例
	fmt.Println("Example:------> Use of Ext <------")

	//4.Ext获得路径中文件名的扩展名
	dir = "/home/polaris/studygolang/study.go"
	fmt.Printf("Ext1:%s\n", filepath.Ext(dir))

	dir = "C:\\home\\polaris\\studygolang\\study.go"
	fmt.Printf("Ext2:%s\n", filepath.Ext(dir))

	//IsAbs,Abs代码示例
	fmt.Println("Example:------> Use of IsAbs and Abs function <------")

	filename := "filepath.go"
	abspath, _ := filepath.Abs(filename)
	fmt.Println("IsAbs:", filepath.IsAbs(filename), "Abs:", abspath)

	//Rel代码示例
	fmt.Println("Example:------> Use of Rel function <------")
	fmt.Println(filepath.Rel("/home/polaris/studygolang", "/home/polaris/studygolang/src/logic/topic.go"))
	fmt.Println(filepath.Rel("/home/polaris/studygolang", "/data/studygolang"))

	//Spilt代码示例
	//Spilt:对于一个常规文件路径,可以通过Split函数得到他的目录路径和文件名
	fmt.Println("Example:------> Use of Spilt function <------")
	// dir == /home/polaris/，file == studygolang
	fmt.Println(filepath.Split("/home/polaris/studygolang"))

	// dir == /home/polaris/studygolang/，file == ""
	fmt.Println(filepath.Split("/home/polaris/studygolang/"))

	// dir == ""，file == studygolang
	fmt.Println(filepath.Split("studygolang"))

	// dir == ""，file == studygolang
	fmt.Println(filepath.Split(""))

	//Join 代码示例
	//Join 用于将多个路径拼接起来，会根据情况添加路径分隔符,结果是经过 Clean 的，所有的空字符串元素会被忽略.
	fmt.Println("Example:------> Use of Join function <------")
	fmt.Println("Join:")

	//SplitList 代码示例
	//与 strings.Split 函数的不同之处是：对 ""，SplitList返回[]string{}，而 strings.Split 返回 []string{""}。SplitList 内部调用的是 strings.Split
	//我们可以使用filepath.SplitList 分割 PATH 或 GOPATH 之类的环境变量,
	fmt.Println("Example:------> Use of SplitList function <------")
	gopath := os.Getenv("GOPATH")
	gopath += ";D:\\Workdir\\temp"
	strList := filepath.SplitList(gopath)
	fmt.Println(strList, reflect.TypeOf(strList))
	//方式一 []string的两种遍历方式
	for i := 0; i < len(strList); i++ {
		fmt.Println("index:", i, "value:", strList[i])
	}
	//方式二  []string的两种遍历方式
	for k, v := range strList {
		fmt.Printf("index:%d value:%s\n", k, v)
	}
	fmt.Println("")

	//Clean 代码示例
	fmt.Println("Example:------> Use of Clean function <------")
	//这个函数主要是返回等价的最短路径 清理规则
	//1..用一个斜线替换多个斜线
	//2.清除当前路径.
	//3.清除内部的..和他前面的元素，如a/b/.. 得到结果a
	//4.以/..开头的，变成/
	fmt.Println(path.Clean("a/c"))               // a/c
	fmt.Println(path.Clean("a//c"))              //以一个/代替// , a/c
	fmt.Println(path.Clean("a/c/."))             //清除. , a/c
	fmt.Println(path.Clean("a/c/b/.."))          // 清除内部..以及前面的元素b; a/c
	fmt.Println(path.Clean("111/../a/c"))        // 清除内部..以及前面的元素111; a/c
	fmt.Println(path.Clean("/../a/b/../././/c")) // 清除/..开头,..以及前面的元素b; /a/c

	//ToSlash 代码示例
	fmt.Println("Example:------> Use of ToSlash function <------")
	path := "F:\\Program Files\\Mysql"
	fmt.Println(filepath.ToSlash(path))
	//Walk 代码示例
	fmt.Println("Example:------> Use of Walk function <------")

	//遍历打印所有的文件名
	//filepath.Walk("C:/Documents and Settings/xxx/Desktop/Copy of change-sub", wjalkFunc)
	//filepath.Walk("F:\\360download", walkFunc)
}
